package com.atguigu.redis7.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.security.SecureRandom;
import java.util.concurrent.TimeUnit;

/**
 * @author zhumq
 * @date 2024/7/28 14:58
 */
@Service
@Slf4j
public class HyperLogLogService {
    @Resource
    private RedisTemplate redisTemplate;
    
    /**
     * 初始化方法，用于模拟多个用户从不同的IP地址访问淘宝首页。
     * 使用HyperLogLog数据结构记录不重复IP的数量，以分析网站的独立访客数。
     * 该方法通过启动一个线程，模拟用户访问的过程，每次访问都会生成一个随机的IP地址，并将其添加到HyperLogLog中。
     * 由于HyperLogLog的特性，它可以高效地估算不重复元素的数量，而不需要存储所有的IP地址。
     * 这对于统计网站的独立访客数是非常有用的，特别是在数据量非常大的情况下。
     */
    //@PostConstruct
    public void initIP()
    {
        new Thread(() -> {
            String ip = null;
            // 200个用户
            for (int i = 0; i < 200; i++) {
                SecureRandom random = new SecureRandom();
                // 生成一个随机的IP地址。
                ip = random.nextInt(256)+"."+
                        random.nextInt(256)+"."+
                        random.nextInt(256)+"."+
                        random.nextInt(256);
                
                // 将生成的IP地址添加到HyperLogLog中，用于统计不重复的IP数量。
                Long hll = redisTemplate.opsForHyperLogLog().add("hll", ip);
                // 输出IP地址及其访问次数，用于调试和日志记录。
                log.info("ip={},该IP地址访问首页的次数={}",ip,hll);
                // 模拟访问间隔，让线程睡眠3秒。
                // 暂停3秒钟
                try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
            }
        },"t1").start();
    }
    
    
    public long uv()
    {
        //PFCOUNT
        return redisTemplate.opsForHyperLogLog().size("hll");
    }

}

